package com.evan.review.viewpager;

/**
 * ViewPager知识点详解及面试要点
 * 
 * 一、ViewPager基本概念
 * 
 * 1. ViewPager定义
 *    - 作用：Android提供的页面切换控件，支持水平滑动切换页面
 *    - 原理：内部使用PagerAdapter适配数据，通过PageTransformer实现页面动画效果
 *    - 使用场景：引导页、图片轮播、Tab页面切换等
 * 
 * 2. ViewPager与Fragment结合
 *    - 优势：Fragment复用性强、生命周期管理方便
 *    - 适配器选择：FragmentPagerAdapter或FragmentStatePagerAdapter
 *    - 常见用法：与TabLayout配合实现标签页切换
 * 
 * 3. ViewPager2的改进
 *    - 基于RecyclerView实现，性能更好
 *    - 支持垂直滑动
 *    - 支持RTL（从右到左）布局
 *    - 更精确的页面切换事件回调
 *    - DiffUtil支持，实现数据集变化的高效更新
 * 
 * 二、ViewPager适配器详解
 * 
 * 1. PagerAdapter
 *    - 基础适配器，需要自己实现页面的创建和销毁
 *    - 核心方法：instantiateItem()、destroyItem()、isViewFromObject()、getCount()
 *    - 使用场景：简单的View页面切换，如图片轮播
 * 
 * 2. FragmentPagerAdapter
 *    - 继承自PagerAdapter，专为Fragment设计
 *    - 特点：适合固定少量页面，Fragment实例会被保留在内存中
 *    - 优点：页面切换快速，不需要重新创建Fragment
 *    - 缺点：当页面过多时容易OOM（内存溢出）
 *    - 实现方式：重写getItem()返回对应位置的Fragment
 * 
 * 3. FragmentStatePagerAdapter
 *    - 继承自PagerAdapter，也为Fragment设计
 *    - 特点：适合大量页面，会销毁不可见的Fragment，只保存状态
 *    - 优点：内存占用低，适合页面数量多的场景
 *    - 缺点：页面重新显示时需要恢复状态，性能略低
 *    - 实现方式：同样重写getItem()，但内部实现销毁和保存机制不同
 * 
 * 4. ViewPager2适配器
 *    - FragmentStateAdapter：替代原来的FragmentStatePagerAdapter
 *    - RecyclerView.Adapter：可直接用RecyclerView的适配器
 *    - 核心区别：基于RecyclerView.Adapter机制，实现更简单，功能更强大
 * 
 * 三、ViewPager性能优化
 * 
 * 1. 页面预加载
 *    - setOffscreenPageLimit()：设置预加载页面数量
 *    - 默认值为1（当前页两侧各预加载1页）
 *    - 增大可提高切换流畅度，但会增加内存占用
 *    - 减小可降低内存占用，但页面切换可能出现卡顿
 * 
 * 2. 懒加载实现
 *    - ViewPager1：通过setUserVisibleHint()判断可见性，延迟加载数据
 *    - ViewPager2：通过FragmentTransaction的setMaxLifecycle()控制生命周期
 *    - 实现目标：页面可见时才加载数据，提高应用启动速度
 * 
 * 3. Fragment复用
 *    - FragmentPagerAdapter：适合固定Tab页面
 *    - FragmentStatePagerAdapter：适合动态或大量页面
 *    - ViewPager2中使用FragmentStateAdapter并设置正确的ContainerId
 * 
 * 4. 页面动画优化
 *    - 使用PageTransformer实现自定义动画效果
 *    - 复杂动画避免在主线程执行耗时操作
 *    - ViewPager2可以使用CompositePageTransformer组合多个动画
 * 
 * 四、常见问题与面试考点
 * 
 * 1. ViewPager与ViewPager2的区别？
 *    答：(1) ViewPager2基于RecyclerView实现，ViewPager基于View实现
 *        (2) ViewPager2支持垂直滑动和RTL布局
 *        (3) ViewPager2提供了更精确的页面切换回调和状态更新
 *        (4) ViewPager2使用FragmentStateAdapter替代了原有适配器
 *        (5) ViewPager2不支持setUserVisibleHint等部分API
 * 
 * 2. FragmentPagerAdapter与FragmentStatePagerAdapter的区别？
 *    答：(1) FragmentPagerAdapter：销毁视图但保留Fragment实例，适合少量固定页面
 *        (2) FragmentStatePagerAdapter：销毁Fragment实例只保存状态，适合大量页面
 *        (3) 内存占用：FragmentPagerAdapter > FragmentStatePagerAdapter
 *        (4) 页面切换效率：FragmentPagerAdapter > FragmentStatePagerAdapter
 *        (5) 使用选择取决于页面数量和复杂度
 * 
 * 3. ViewPager懒加载如何实现？
 *    答：ViewPager1实现方式：
 *        (1) 重写setUserVisibleHint()方法判断Fragment可见性
 *        (2) 在onResume()中配合isVisible标志位判断是否加载数据
 *        (3) 设置适当的offscreenPageLimit控制预加载范围
 *        
 *        ViewPager2实现方式：
 *        (1) 利用Lifecycle感知组件的生命周期
 *        (2) 在onResume中结合isVisibleToUser标志位判断加载时机
 *        (3) 使用FragmentTransaction.setMaxLifecycle()控制生命周期
 * 
 * 4. ViewPager页面切换事件如何监听？
 *    答：ViewPager1：
 *        (1) 使用addOnPageChangeListener()添加监听器
 *        (2) 实现OnPageChangeListener接口的三个方法：
 *            - onPageScrolled：页面滑动过程回调
 *            - onPageSelected：页面被选中回调
 *            - onPageScrollStateChanged：滑动状态变化回调
 *        
 *        ViewPager2：
 *        (1) 使用registerOnPageChangeCallback()注册回调
 *        (2) 需要在不使用时调用unregisterOnPageChangeCallback()解注册
 * 
 * 5. ViewPager常见OOM原因及解决方案？
 *    答：常见OOM原因：
 *        (1) FragmentPagerAdapter保留大量Fragment实例
 *        (2) 页面中加载大量图片或重量级对象
 *        (3) offscreenPageLimit设置过大
 *        
 *        解决方案：
 *        (1) 使用FragmentStatePagerAdapter替代FragmentPagerAdapter
 *        (2) 合理设置offscreenPageLimit值
 *        (3) 图片加载使用Glide/Picasso等框架并合理配置缓存
 *        (4) 在Fragment的onDestroy中释放占用资源
 *        (5) ViewPager2中使用RecyclerView.RecycledViewPool优化复用
 * 
 * 6. 如何实现自定义ViewPager切换动画？
 *    答：(1) 实现ViewPager.PageTransformer接口（ViewPager1）
 *        (2) 重写transformPage(View page, float position)方法
 *        (3) 根据position参数的值（-1到1之间）设置不同的动画效果
 *        (4) 使用setPageTransformer()应用动画效果
 *        (5) ViewPager2可以使用CompositePageTransformer组合多个动画效果
 * 
 * 7. ViewPager嵌套使用注意事项？
 *    答：(1) 处理滑动冲突：内外层ViewPager的滑动方向应该不同
 *        (2) 使用requestDisallowInterceptTouchEvent()控制事件分发
 *        (3) 考虑使用NestedScrollView代替嵌套ViewPager
 *        (4) 控制Fragment的层级，避免嵌套过深
 *        (5) ViewPager2嵌套时注意生命周期管理和事件传递
 * 
 * 8. TabLayout与ViewPager如何结合使用？
 *    答：ViewPager1结合TabLayout：
 *        (1) 使用TabLayout.setupWithViewPager()方法关联
 *        (2) 在PagerAdapter中重写getPageTitle()提供标签文本
 *        (3) 可以通过TabLayout.getTabAt(index).setCustomView()自定义标签视图
 *        
 *        ViewPager2结合TabLayout：
 *        (1) 使用TabLayoutMediator类进行绑定
 *        (2) 在TabLayoutMediator构造函数中提供标签配置回调
 *        (3) 调用TabLayoutMediator.attach()完成绑定
 * 
 * 9. ViewPager2中禁用用户滑动如何实现？
 *    答：(1) 调用viewPager2.setUserInputEnabled(false)即可禁用用户滑动
 *        (2) ViewPager1则需要重写onInterceptTouchEvent()和onTouchEvent()返回false
 *        (3) 也可以通过自定义Layout继承ViewPager实现更精细的控制
 * 
 * 10. ViewPager在抖音/TikTok这类短视频应用中的应用？
 *    答：(1) 使用ViewPager2的垂直滑动模式实现上下滑动切换视频
 *        (2) 结合懒加载技术，当前页播放视频，预加载页准备视频
 *        (3) 使用Fragment的setMaxLifecycle控制视频的加载和释放
 *        (4) 实现自定义PageTransformer创建平滑的过渡效果
 *        (5) 使用RecyclerView的预加载和缓存机制提高性能
 *        (6) 注意在页面切换时正确处理视频的播放/暂停状态
 */
public class ViewPagerDoc {
    // 这是一个文档类，只包含注释，没有实际代码
} 